#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PHONE_LENGTH 11    // 电话号码长度
#define HASH_SIZE 131071   // 哈希表大小
#define MAX_RECORDS 200000 // 最大记录数

// 哈希节点结构体
typedef struct
{
    char phone[PHONE_LENGTH + 1]; // 电话号码
    int count;                    // 通话次数
    int next;                     // 指向下一个节点的索引
} HashNode;

HashNode nodes[MAX_RECORDS]; // 存储所有哈希节点
int hashTable[HASH_SIZE];    // 哈希表存储节点索引
int nodeIndex = 0;           // 当前节点索引

// 计算电话号码的哈希值
unsigned int hash(const char *phone)
{
    unsigned int hashValue = 0;
    for (int i = 0; phone[i] != '\0'; i++)
    {
        hashValue = hashValue * 131 + (phone[i] - '0'); // 计算哈希值
    }
    return hashValue % HASH_SIZE; // 取模映射到哈希表
}

// 查找或插入电话记录
void findOrInsert(const char *phone, int *maxCount, char *maxPhone, int *tieCount)
{
    unsigned int index = hash(phone); // 获取哈希值
    int nodeIdx = hashTable[index];   // 从哈希表查找链表起点

    // 遍历链表查找电话记录
    while (nodeIdx != -1)
    {
        if (strcmp(nodes[nodeIdx].phone, phone) == 0)
        {                           // 找到电话记录
            nodes[nodeIdx].count++; 

            // 更新最大值和并列统计
            if (nodes[nodeIdx].count > *maxCount)
            {
                *maxCount = nodes[nodeIdx].count;
                strcpy(maxPhone, phone);
                *tieCount = 1;
            }
            else if (nodes[nodeIdx].count == *maxCount)
            {
                (*tieCount)++;
                if (strcmp(phone, maxPhone) < 0)
                { // 比较字典序
                    strcpy(maxPhone, phone);
                }
            }
            return;
        }
        nodeIdx = nodes[nodeIdx].next; // 继续遍历链表
    }

    // 插入新节点
    nodes[nodeIndex].count = 1;
    strcpy(nodes[nodeIndex].phone, phone);
    nodes[nodeIndex].next = hashTable[index];
    hashTable[index] = nodeIndex; // 更新哈希表

    // 更新最大值和并列统计
    if (nodes[nodeIndex].count > *maxCount)
    {
        *maxCount = nodes[nodeIndex].count;
        strcpy(maxPhone, phone);
        *tieCount = 1;
    }
    else if (nodes[nodeIndex].count == *maxCount)
    {
        (*tieCount)++;
        if (strcmp(phone, maxPhone) < 0)
        {
            strcpy(maxPhone, phone);
        }
    }

    nodeIndex++; // 增加节点索引
}

int main()
{
    int n; // 通话记录条数
    if (scanf("%d", &n) != 1 || n <= 0)
    { // 读取输入条数
        return 1;
    }

    // 初始化哈希表
    memset(hashTable, -1, sizeof(hashTable));
    memset(nodes, 0, sizeof(nodes));

    char phone1[PHONE_LENGTH + 1], phone2[PHONE_LENGTH + 1];
    int maxCount = 0;                     // 最大通话次数
    int tieCount = 0;                     // 并列号码数量
    char maxPhone[PHONE_LENGTH + 1] = ""; // 最大通话次数的号码

    // 读取通话记录
    for (int i = 0; i < n; i++)
    {
        if (scanf("%s %s", phone1, phone2) != 2)
        {
            return 1; // 输入错误
        }
        findOrInsert(phone1, &maxCount, maxPhone, &tieCount); // 处理拨出方
        findOrInsert(phone2, &maxCount, maxPhone, &tieCount); // 处理接收方
    }

    // 输出结果
    printf("%s %d", maxPhone, maxCount);
    if (tieCount > 1)
    { // 输出并列号码数量
        printf(" %d", tieCount);
    }
    printf("\n");

    return 0;
}
